package com.example.lettcode._202412._20241204;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

/*
705. 设计哈希集合
不使用任何内建的哈希表库设计一个哈希集合（HashSet）。
实现 MyHashSet 类：
void add(key) 向哈希集合中插入值 key 。
bool contains(key) 返回哈希集合中是否存在这个值 key 。
void remove(key) 将给定值 key 从哈希集合中删除。如果哈希集合中没有这个值，什么也不做。

示例：
输入：
["MyHashSet", "add", "add", "contains", "contains", "add", "contains", "remove", "contains"]
[[], [1], [2], [1], [3], [2], [2], [2], [2]]
输出：
[null, null, null, true, false, null, true, null, false]

解释：
MyHashSet myHashSet = new MyHashSet();
myHashSet.add(1);      // set = [1]
myHashSet.add(2);      // set = [1, 2]
myHashSet.contains(1); // 返回 True
myHashSet.contains(3); // 返回 False ，（未找到）
myHashSet.add(2);      // set = [1, 2]
myHashSet.contains(2); // 返回 True
myHashSet.remove(2);   // set = [1]
myHashSet.contains(2); // 返回 False ，（已移除）

提示：
0 <= key <= 106
最多调用 104 次 add、remove 和 contains


 */
public class _02_she_ji_ha_xi_ji_he {

    public static void main(String[] args) {
        MyHashSet set = new MyHashSet();
        set.add(1);
        set.add(2);
        System.out.println(set.contains(1));
        System.out.println(set.contains(3));
        set.add(2);
        System.out.println(set.contains(2));
        set.remove(2);
        System.out.println(set.contains(2));
    }
}

class MyHashSet {
    private int allIndex = 769;
    private LinkedList[] linkedList;

    public MyHashSet() {
       linkedList = new LinkedList[allIndex];
        for (int i = 0; i < allIndex; i++) {
            linkedList[i] = new LinkedList<Integer>();
        }
    }

    public void add(int key) {
        int index = key % allIndex;
        LinkedList list = this.linkedList[index];
        if (linkedList == null) {
            list = new LinkedList<>();
            list.add(key);
            this.linkedList[index] = list;
        } else {
            if (!list.contains(key)) {
                list.add(key);
            }
        }
    }

    public void remove(int key) {
        int index = key % this.allIndex;
        LinkedList linkedList = this.linkedList[index];
        if (linkedList == null) {
            return;
        } else {
            if (linkedList.contains(key)) {
                linkedList.remove(Integer.valueOf(key));
            }
        }

    }

    public boolean contains(int key) {
        int index = key % this.allIndex;
        LinkedList linkedList = this.linkedList[index];
        return linkedList == null ? false : linkedList.contains(key);
    }
}
